package com.atguigu.gulimall.search.handler;

import com.atguigu.common.exception.GulimallEnum;
import com.atguigu.common.exception.GulimallException;
import com.atguigu.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestControllerAdvice(basePackages = "com.atguigu.gulimall")
@Slf4j
public class GuliMallExceptionControllerAdvice {
     @ExceptionHandler(GulimallException.class)
     public R handleGulimallException(GulimallException e){
         //这是一个格式化的日志消息字符串。其中的 {} 是一个占位符，它将被后面的参数替换。
         // 这种格式化方式允许你在日志消息中包含动态数据，而不需要使用字符串拼接或其他方式。
       log.error("抛出gulimall异常:{}",e.getMsg());
       return R.error(e.getCode(),e.getMsg());
     }
     @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e){
         log.error("参数校验异常:",e);
         BindingResult bindingResult = e.getBindingResult();
         List<FieldError> fieldErrors = bindingResult.getFieldErrors();
         Map<String, String> map = new HashMap<>();
         fieldErrors.forEach((item)->{
             String field = item.getField();
             String msg = item.getDefaultMessage();
             map.put(field,msg);
         });
         return R.error(400,"参数校验异常").put("data",map);
     }
     //这里就处理未知，你没定义考虑在内的异常，就是常规异常
     @ExceptionHandler(value = Throwable.class)
     public R handleException(Throwable e){
         log.error("系统抛出未知异常:",e);
         return R.error(GulimallEnum.UNKONW_EXCEPTION.getCode(),GulimallEnum.UNKONW_EXCEPTION.getMsg());
     }
}
